# koroFileHeader at Yungoal acer
# Create: 2023-03-31 16:34:51
# LastEdit: 2023-03-31 16:36:06
"""语法着色:
https://docs.djangoproject.com/zh-hans/4.0/ref/django-admin/#syntax-coloring
这里用的不是django.utils稳定的模块
利用这个模块输出带颜色的醒目日志,并且识别在不支持颜色终端输出普通日志

禁用日志记录配置:
https://docs.djangoproject.com/zh-hans/4.0/topics/logging/#disabling-logging-configuration
禁用 Django 的日志配置,然后手动配置日志.原因是无法修改DEFAULT_LOGGING中的个别配置
"""
__author__ = '749B'

import logging
from utils import color

PROJECT_NAME = 'ygcmp'

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
        # 2个都是原始的
    },
    'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[{asctime}] {message}',  # 时间改用logging模块的asctime
            'datefmt': '%Y-%m-%d %H:%M:%S',  # 增加一行，修改日期格式
            'style': '{',
        },
        # 上面1个是原始的，下面的是自定义的
        'with_time': {
            '()': f'{PROJECT_NAME}.settings_log.ConsoleFormatter',
            'format': '[{asctime}] {levelname} {name}: {message}',
            'datefmt': '%Y-%m-%d %H:%M:%S',
            'style': '{',
        },
        'with_lineno': {
            '()': f'{PROJECT_NAME}.settings_log.ConsoleFormatter',
            'format': '{levelname} {name}[{lineno:d}]: {message}',
            'style': '{',
        }
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        # 上面3个是原始的，下面是自定义的
        'with_time': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'with_time'
        },
        'with_lineno': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'with_lineno'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
        # 上面2个是原始的，下面是自定义的
        'billing': {
            'handlers': ['with_time'],
            'level': 'DEBUG',
        },
        'tasks': {
            'handlers': ['with_time'],
            'level': 'DEBUG',
        },
        'utils': {
            'handlers': ['with_lineno'],
            'level': 'DEBUG',
        },
    }
}


class ConsoleFormatter(logging.Formatter):

    def __init__(self, *args, **kwargs):
        self.style = color.Style()
        super().__init__(*args, **kwargs)

    def format(self, record):
        """
        这个格式要求levelname是第一个要显示颜色的字段,开头添加格式并且不在结尾添加重置格式
        并且msg是最后一个字段,在结尾添加格式结束
        """
        msg = record.msg
        record.levelname = 'SUCCESS' if record.levelno == 25 else record.levelname
        levelname = record.levelname[:3]

        if 50 <= record.levelno:
            levelname = self.style.CRITICAL(levelname, noreset=True)
        elif 40 <= record.levelno < 50: 
            levelname = self.style.ERROR(levelname, noreset=True)
        elif 30 <= record.levelno < 40: 
            levelname = self.style.WARNING(levelname, noreset=True)
        elif record.levelno == 25:
            levelname = self.style.SUCCESS(levelname, noreset=True)
        elif 20 <= record.levelno < 30:
            levelname = self.style.INFO(levelname, noreset=True)
        elif 10 <= record.levelno < 20: 
            levelname = self.style.DEBUG(levelname, noreset=True)
        else:
            levelname = self.style.NOTSET(levelname, noreset=True)
        msg = self.style.RESET(msg)

        record.msg = msg
        record.levelname = levelname
        return super().format(record)



